package com.lanqiao.hashtab;

public class HashTabDemo {
	public static void main(String[] args) {
		
		HashTab hashTab = new HashTab(7);
		
	}
}

//雇员
class Emp {
	public int id;
	public String name;
	public Emp next;
	
	public Emp(int id, String name) {
		this.id = id;
		this.name = name;
	}
	
}

//创建HashTab，管理多条链表
class HashTab {
	private int size;//表示有多少条链表
	private EmpLinkList[] empLinkListArray;
	
	public HashTab(int size) {
		empLinkListArray = new EmpLinkList[size];
		this.size = size;
		//初始化每个链表，否则为null
		for (int i = 0; i < size; i++) {
			empLinkListArray[i] = new EmpLinkList();
		}
	}
	
	public void add(Emp emp) {
		//根据员工id，得到该员工应添加到那条链表
		int empLinkedListNo = hashFun(emp.id);
		//添加到对应的链表
		empLinkListArray[empLinkedListNo].add(emp);
	}
	
	//编写散列函数
	public int hashFun(int id) {
		return id % size;
	}
	
	//根据输入id查找
	public void findEmpById(int id) {
		int empLinkedListNo = hashFun(id);
		Emp emp = empLinkListArray[empLinkedListNo].findEmpById(id);
		if (emp != null) {
			System.out.printf("在第%d条链表中找到雇员id=%d\n", (empLinkedListNo + 1), id);
		}else {
			System.out.println("没有找到该雇员！");
		}
	}
	
	public void list() {
		for (int i = 0; i < size; i++) {
			empLinkListArray[i].list(i);
		}
	}
}



//创建EmpLinkList，表示链表
class EmpLinkList {
	//头指针
	private Emp head;
	
	public void add(Emp emp) {
		//第一个雇员
		if (head == null) {
			head = emp;
			return;
		}
		//不是第一个，找到链表最后
		Emp curEmp = head;
		while (true) {
			if (curEmp.next == null) {
				break;
			}
			curEmp = curEmp.next;
		}
		curEmp.next =emp;
	}
	
	
	public void list(int no) {
		if (head == null) {
			System.out.println("第" + (no + 1) + "链表为空！");
			return;
		}
		System.out.println("第" + (no + 1) + "链表的信息为：");
		Emp curEmp = head;
		while (true) {
			System.out.printf("=> id => %d name=%s\t", curEmp.id, curEmp.name);
			if (curEmp.next == null) {
				break;
			}
			curEmp = curEmp.next;
		}
		System.out.println();
	}
	
	public Emp findEmpById(int id) {
		if (head == null) {
			System.out.println("链表为空！");
			return null;
		}
		Emp curEmp = head;
		while (true) {
			if (curEmp.id == id) {
				break;
			}
			if (curEmp.next == null) {
				curEmp = null;
				break;
			}
			curEmp = curEmp.next;
		}
		return curEmp;
	}
	
}